﻿using System;
using System.Collections.Generic;
using System.Data;
using Atendex.Dominio;
using Atendex.Dominio.Interfaces;
using Atendex.Infraestrutura;
using Atendex.Infraestrutura.Repositórios;
using System.Collections;
using Atendex.Containex;
using System.Linq;
using System.Web.UI.WebControls;
using Atendex.Web.AppCode;
using System.Net.Mail;
using System.Web.UI;

namespace Atendex.Web
{
    public partial class CadastrarAtendimento : System.Web.UI.Page
    {
        private RepositorioAtendente repAtendente = new RepositorioAtendente();
        private IAtendimento AtendimentoAtual
        {
            get { return (IAtendimento)ViewState["atendimento"]; }
            set { ViewState["atendimento"] = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            //InicializadorRepositorio.InicializaRepositorio();
            if (!Page.IsPostBack)
            {
                IAtendente atendente = AtendexContext.AtendenteAtual(this);
                if (atendente != null)
                {
                    CarregarCombos();
                    CarregarCheckLists();
                    AtendimentoAtual = Container.CriarAtendimento(atendente);
                }
                else
                {
                    this.pnlCadastro.Visible = false;
                    MostrarMensagem("Você deve fazer o login como atendente antes de cadastrar um Atendimento.");
                }
            }
            else
            {
                CarregarCheckLists();
                lblMessage.Visible = false;
            }
        }

        private void CarregarCombos()
        {
            ICurso[] cursos = new RepositorioCurso().ObtemTodos();
            IMeio[] meios = new RepositorioMeio().ObtemTodos();
            ITipoSolicitante[] tiposSolicitante = new RepositorioTipoSolicitante().ObtemTodos();

            ddlCurso.DataSource = cursos;
            ddlCurso.DataTextField = "Nome";
            ddlCurso.DataValueField = "Id";
            ddlCurso.DataBind();
            
            ddlMeioAtendimento.DataSource = meios;
            ddlMeioAtendimento.DataTextField = "Nome";
            ddlMeioAtendimento.DataValueField = "Id";
            ddlMeioAtendimento.DataBind();

            ddlTipoRequerente.DataSource = tiposSolicitante;
            ddlTipoRequerente.DataTextField = "Nome";
            ddlTipoRequerente.DataValueField = "Id";
            ddlTipoRequerente.DataBind();
        }

        private void CarregarCheckLists()
        {
            ITipoSolicitacaoAN[] tiposAtendimento = new RepositorioTipoSolicitacaoAN().ObtemTodos();

            IUnidadeNegocio[] unidadesNegocio = new RepositorioUnidadeNegocio().ObtemTodos();
            ITipoSolicitacaoCurso[] tipoCursos = new RepositorioTipoSolicitacaoCurso().ObtemTodos();

            bool par = true;
            foreach(IUnidadeNegocio un in unidadesNegocio)
            {
                Label lbl = new Label();
                lbl.Text = un.Nome;
                CheckBoxList list = new CheckBoxList();
                list.ID = "chk" + un.Id;

                foreach(ITipoSolicitacao tipo in un.TiposSolicitacao)
                    list.Items.Add(new ListItem(tipo.Nome, tipo.Id.ToString()));

                Panel1.Controls.Add(new LiteralControl("<table>"));
                if (par)
                {
                    Panel1.Controls.Add(new LiteralControl("<tr><td>"));
                    Panel1.Controls.Add(lbl);
                    Panel1.Controls.Add(new LiteralControl("<br /><br />"));
                    Panel1.Controls.Add(list);
                    Panel1.Controls.Add(new LiteralControl("<br /><br /></td>"));
                }
                else
                {
                    Panel1.Controls.Add(new LiteralControl("<tr><td>"));
                    Panel1.Controls.Add(lbl);
                    Panel1.Controls.Add(new LiteralControl("<br /><br />"));
                    Panel1.Controls.Add(list);
                    Panel1.Controls.Add(new LiteralControl("<br /><br /></td></tr>"));
                }
                par = !par;
            }

            Label lblC = new Label();
            lblC.Text = "Cursos";
            CheckBoxList listC = new CheckBoxList();
            listC.ID = "chkCursos";

            foreach (ITipoSolicitacaoCurso tipo in tipoCursos)
                listC.Items.Add(new ListItem(tipo.Nome, tipo.Id.ToString()));

            if (par)
            {
                Panel2.Controls.Add(new LiteralControl("<tr><td>"));
                Panel2.Controls.Add(lblC);
                Panel2.Controls.Add(new LiteralControl("<br /><br />"));
                Panel2.Controls.Add(listC);
                Panel2.Controls.Add(new LiteralControl("<br /><br /></td>"));
            }
            else
            {
                Panel2.Controls.Add(new LiteralControl("<tr><td>"));
                Panel2.Controls.Add(lblC);
                Panel2.Controls.Add(new LiteralControl("<br /><br />"));
                Panel2.Controls.Add(listC);
                Panel2.Controls.Add(new LiteralControl("<br /><br /></td></tr>"));
            }

            Session["UN"] = unidadesNegocio;
            Session["cursos"] = tipoCursos;
        }

        protected void btnCadastrar_Click(object sender, EventArgs e)
        {
            try
            {
                IAtendimento atendimento = AtendimentoAtual;

                atendimento.DataInicio = DateTime.Now;
                atendimento.DataFim = DateTime.Now;

                atendimento.Solicitante = Container.CriarSolicitante(txtNomeRequerente.Text,
                    new RepositorioMeio().ObtemPorId(Convert.ToInt32(ddlMeioAtendimento.SelectedValue)));
                atendimento.Solicitante.Tipo = new RepositorioTipoSolicitante().ObtemPorId(Convert.ToInt32(ddlTipoRequerente.SelectedValue));
                atendimento.Solicitante.Telefone = txtTelefone.Text;
                atendimento.Solicitante.EmailContato = txtEmail.Text;

                IUnidadeNegocio[] unidadesNegocio = (IUnidadeNegocio[])Session["UN"];
                foreach (IUnidadeNegocio un in unidadesNegocio)
                {
                    foreach (ListItem item in ((CheckBoxList)Panel1.FindControl("chk" + un.Id)).Items)
                    {
                        if (item.Selected)
                        {
                            ITipoSolicitacaoAN tipoSolicitacao = new RepositorioTipoSolicitacaoAN().ObtemPorId(Convert.ToInt32(item.Value));
                            IOrdemServico ordem = Container.CriarOrdemServico(atendimento, tipoSolicitacao, Container.CriarMensagem(txtMensagemUN.Text));
                            atendimento.OrdensServico.Add(ordem);
                        }
                    }
                }

                foreach (ListItem item in ((CheckBoxList)Panel2.FindControl("chkCursos")).Items)
                {
                    if (item.Selected)
                    {
                        ITipoSolicitacaoCurso tipoSolicitacao = new RepositorioTipoSolicitacaoCurso().ObtemPorId(Convert.ToInt32(item.Value));
                        tipoSolicitacao.AreaNegocio = new RepositorioCurso().ObtemPorId(Convert.ToInt32(ddlCurso.SelectedValue));
                        IOrdemServico ordem = Container.CriarOrdemServico(atendimento, tipoSolicitacao, Container.CriarMensagem(txtMensagemCursos.Text));
                        atendimento.OrdensServico.Add(ordem);
                    }
                }


                atendimento.Status = StatusAtendimento.Pendente;

                new RepositorioAtendimento().Salvar(atendimento);

                foreach (IOrdemServico ordem in atendimento.OrdensServico)
                    ordem.EnviarEmail();

                MostrarMensagem("Cadastro com sucesso.");
            }
            catch (Exception ex)
            {
                MostrarMensagem(ex.Message);
            }
        }

        protected void btnCadastroRapido_Click(object sender, EventArgs e)
        {
            try
            {
                IAtendimento atendimento = AtendimentoAtual;

                atendimento.DataInicio = DateTime.Now;
                atendimento.DataFim = DateTime.Now;

                atendimento.Solicitante = Container.CriarSolicitante(txtNomeRequerente.Text,
                    new RepositorioMeio().ObtemPorId(Convert.ToInt32(ddlMeioAtendimento.SelectedValue)));
                atendimento.Solicitante.Tipo = new RepositorioTipoSolicitante().ObtemPorId(Convert.ToInt32(ddlTipoRequerente.SelectedValue));
                atendimento.Solicitante.Telefone = txtTelefone.Text;
                atendimento.Solicitante.EmailContato = txtEmail.Text;

                IUnidadeNegocio[] unidadesNegocio = (IUnidadeNegocio[])Session["UN"];
                foreach (IUnidadeNegocio un in unidadesNegocio)
                {
                    foreach (ListItem item in ((CheckBoxList)Panel1.FindControl("chk" + un.Id)).Items)
                    {
                        if (item.Selected)
                        {
                            ITipoSolicitacaoAN tipoSolicitacao = new RepositorioTipoSolicitacaoAN().ObtemPorId(Convert.ToInt32(item.Value));
                            IOrdemServico ordem = Container.CriarOrdemServico(atendimento, tipoSolicitacao, Container.CriarMensagem(txtMensagemUN.Text));
                            atendimento.OrdensServico.Add(ordem);
                        }
                    }
                }

                foreach (ListItem item in ((CheckBoxList)Panel2.FindControl("chkCursos")).Items)
                {
                    if (item.Selected)
                    {
                        ITipoSolicitacaoCurso tipoSolicitacao = new RepositorioTipoSolicitacaoCurso().ObtemPorId(Convert.ToInt32(item.Value));
                        tipoSolicitacao.AreaNegocio = new RepositorioCurso().ObtemPorId(Convert.ToInt32(ddlCurso.SelectedValue));
                        IOrdemServico ordem = Container.CriarOrdemServico(atendimento, tipoSolicitacao, Container.CriarMensagem(txtMensagemCursos.Text));
                        atendimento.OrdensServico.Add(ordem);
                    }
                }


                atendimento.Status = StatusAtendimento.Encerrado;

                new RepositorioAtendimento().Salvar(atendimento);
                MostrarMensagem("Cadastro com sucesso.");
            }
            catch (Exception ex)
            {
                MostrarMensagem(ex.Message);
            }
        }


        protected void MostrarMensagem(string mensagem)
        {
            lblMessage.Text = mensagem;
            lblMessage.Visible = true;

        }

    }
}
